package com.sky.mapper;

import com.sky.dto.GoodsSalesDTO;
import com.sky.dto.OrdersPageQueryDTO;
import com.sky.entity.Orders;
import org.apache.ibatis.annotations.Options;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

public interface OrdersMapper {
    int deleteByPrimaryKey(Long id);

    int insert(Orders record);

    @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
    int insertSelective(Orders record);

    Orders selectByPrimaryKey(Long id);

    int updateByPrimaryKeySelective(Orders record);

    int updateByPrimaryKey(Orders record);

    /**
     * 根据订单号修改订单信息
     * @param orders 订单信息Status/PayStatus/CheckoutTime
     * @return 受影响的订单数量，正常返回1
     */
    int updateByNumber(Orders orders);

    /**
     * 根据用户id查询订单信息
     * @param ordersPageQueryDTO 包含查询条件（用户id，订单状态）
     * @return 订单信息集合
     */
    List<Orders> selectByUserIdAndStatus(OrdersPageQueryDTO ordersPageQueryDTO);

    /**
     * 根据条件统计订单数量
     * @param map 查询条件，当天的开始时间和结束时间以及订单状态
     * @return 订单数量
     */
    Integer countByMap(Map<String, Object> map);

    /**
     * 根据条件统计订单金额
     * @param map 查询条件，当天的开始时间和结束时间以及订单状态
     * @return 订单金额
     */
    Double sumTurnoverByMap(Map<String, Object> map);

    /**
     * 管理端分页查询订单信息
     * @param ordersPageQueryDTO 查询条件（订单状态，订单号，手机号）
     * @return 订单信息集合
     */
    List<Orders> selectByPageQuery(OrdersPageQueryDTO ordersPageQueryDTO);

    /**
     * 根据状态查询订单数量
     * @param pendingPayment 订单支付状态
     * @param time 订单创建时间
     * @return 订单数量
     */
    List<Orders> selectStatusAndOrderTime(Integer pendingPayment, LocalDateTime time);

    /**
     * 根据订单号查询订单信息
     * @param number 订单号
     * @return 订单信息
     */
    Orders selectByNumber(String number);

    /**
     * 查询销量排名top10
     * @param map 查询条件，开始时间和结束时间
     * @return 销量排名top10的订单信息
     */
    List<GoodsSalesDTO> getSalesTop10(Map<String, Object> map);
}